package hit.edu.zjc.UserInterface;

import java.util.ArrayList;

public class UDIntegerType extends UserDef {
	
	public static final int MAXFILL=101;
	public static final int MINFILL=102;
	public static final int AVEFILL=103;
	public static final int MOSTFREQUENTFILL=104;
	public static final int LEASTFREQUENTFILL=105;
	
	public int Max;
	public int Min;
	public int CorrectValue;
	public boolean check_max;
	public boolean check_min;

	//对此列不处理
	public UDIntegerType()
	{
		super(IntegerType,false,false,true);
	}
	//EasyFill,不一致修复
	public UDIntegerType(boolean ic, boolean in,int max,boolean cmax,int min,boolean cmin,int cv,int ft) {
		super(IntegerType, ic, in,true);
		Max=max;
		Min=min;
		CorrectValue=cv;
		check_max=cmax;
		check_min=cmin;
		FillType=ft;
	}
	
	public UDIntegerType(boolean ic, boolean in,int max,boolean cmax,int min,boolean cmin,int cv) {
		super(IntegerType, ic, in,true);
		Max=max;
		Min=min;
		CorrectValue=cv;
		check_max=cmax;
		check_min=cmin;
	}
	
	
	
	//非EasyFill,值缺失填充		
	public UDIntegerType(int max,boolean cmax,int min,boolean cmin,int ft,int[] cid)
	{
		super(IntegerType,true,false,false);
		Max=max;
		Min=min;
		check_max=cmax;
		check_min=cmin;
		FillType=ft;
		RelevantColumID=new int[cid.length];
		for(int i=0;i<cid.length;i++)
		{
			RelevantColumID[i]=cid[i];
		}
	}

	@Override
	public boolean checkdata(String ob) {
		Integer int_ob;
		try{
			int_ob=Integer.parseInt(ob);
		}
		catch(Exception e)
		{
			return false;
		}
		if(int_ob==null)
		{
			if(isNull)
				return true;
			else
				return false;
		}
		int value=int_ob;
		if(check_max&&value>Max)
			return false;
		if(check_min&&value<Min)
			return false;
		return true;

	}

	@Override
	public String correctdata() {
		if(isEasyFill)
		{
			return new Integer(CorrectValue).toString();
		}
		else
		{
			return null;
		}
	}
	@Override
	public String complexFill(String[] data)
	{
		if(FillType==EASYFILL)
			return new Integer(CorrectValue).toString();
		if(data.length==0)
			return null;
		ArrayList<String> strlist=new ArrayList<String>(data.length);
		for(int i=0;i<data.length;i++)
		{
			if(data[i]==null||data[i].trim().equals(""))
				continue;
			strlist.add(data[i]);
		}
		if(strlist.size()==0)
			return null;
		int[] value=new int[strlist.size()];
		for(int i=0;i<strlist.size();i++)
		{
			value[i]=Integer.parseInt(strlist.get(i));
		}
		if(FillType==MAXFILL)//最大值填充
		{
			int maxindex=0;
			for(int i=1;i<value.length;i++)
			{
				if(value[i]>value[maxindex])
					maxindex=i;
			}
			return new Integer(value[maxindex]).toString();
		}
		else if(FillType==MINFILL)
		{
			int minindex=0;
			for(int i=1;i<value.length;i++)
			{
				if(value[i]<value[minindex])
					minindex=i;
			}
			return new Integer(value[minindex]).toString();
		}
		else if(FillType==AVEFILL)
		{
			int sum=0;
			for(int i=0;i<value.length;i++)
			{
				sum=sum+value[i];
			}
			int ave=sum/value.length;
			return new Integer(ave).toString();
		}
		else if(FillType==MOSTFREQUENTFILL)
		{
			ArrayList<Integer> orglist=new ArrayList<Integer>();
			int[] times_array=new int[value.length];
			for(int i=0;i<value.length;i++)
			{
				int k=0;
				for(;k<orglist.size();k++)
				{
					if(orglist.get(k)==value[i])
					{
						times_array[k]++;
						break;
					}
				}
				if(k==orglist.size())
				{
					int size=orglist.size();
					orglist.add(size,value[i]);
					times_array[size]=1;
				}
			}
			int maxindex=0;
			for(int i=1;i<orglist.size();i++)
			{
				if(times_array[i]>times_array[maxindex])
					maxindex=i;
			}
			return orglist.get(maxindex).toString();
		}
		else if(FillType==LEASTFREQUENTFILL)
		{
			ArrayList<Integer> orglist=new ArrayList<Integer>();
			int[] times_array=new int[value.length];
			for(int i=0;i<value.length;i++)
			{
				int k=0;
				for(;k<orglist.size();k++)
				{
					if(orglist.get(k)==value[i])
					{
						times_array[k]++;
						break;
					}
				}
				if(k==orglist.size())
				{
					int size=orglist.size();
					orglist.add(size,value[i]);
					times_array[size]=1;
				}
			}
			int minindex=0;
			for(int i=1;i<orglist.size();i++)
			{
				if(times_array[i]<times_array[minindex])
					minindex=i;
			}
			return orglist.get(minindex).toString();
		}
		else
			return null;
	}

}
